Análisis de Datos II

Profesor: Oldemar Rodríguez

Estudiante: Jimmy Calvo Monge

Carné: B31281


TAREA 11

Fecha de entrega: 13 de Noviembre de 2022

Importamos los módulos necesarios para resolver esta tarea.

Pregunta 1

Cree en Python usando numpy un tensor de 0D, 1D, 2D y uno 3D.

Pregunta 2

Imprima las dimensiones (shape) de la tabla de entrenamiento de MNIST. Esta es una tabla de dígitos escritos a mano y se usan para problemas de clasificación (problemas predictivos). Esta tabla viene con el paquete tensorflow y se obtiene como sigue:

Las dimensiones de ambas tablas son las siguientes:

Como vemos, ambas son en realidad tensores (tienen 3 dimensiones).

Pregunta 3

¿Qué tipo de datos contiene MNIST?

Este conjunto de datos está formado por dos tensores de 3 dimensiones (uno para entrenamiento y otro para prueba). Cada elemento en un tensor se puede ver como una matriz, de tamaño $28 \times 28$. Cada matriz en realidad representa un dígito escrito a mano.

Pregunta 4

La operación relu() es una operación que se aplica entrada por entrada de un vector, esta devuelve el máximo entre cada entrada del vector y 0 (relu(x) = max(x,0)). Reprograme esta función en Python y después pruébela con el siguiente vector x.

Pregunta 5

Calcule "a mano" el gradiente de la siguiente función:

$$ f(x, y, z) = 3x^4 - 6x\sin(yz) + 3y\cos(z). $$

Respuesta: El gradiente que se solicita viene dado por lo siguiente: (lo he calculado a mano).

$$ \begin{align*} &\frac{\partial f}{\partial x} = 12x^3 - 6\sin(yz) \\\\ &\frac{\partial f}{\partial y} = -6xz\cos(yz) + 3\cos(z) \\\\ &\frac{\partial f}{\partial z} = -6xy\cos(yz) -3y\sin(z). \end{align*} $$

Por lo tanto

$$ \nabla f(x,y,z) = (12x^3 - 6\sin(yz), -6xz\cos(yz) + 3\cos(z), -6xy\cos(yz) -3y\sin(z) ) $$

Pregunta 6

Usando el algoritmo del Descenso de Gradiente encuentre "a mano" (puede utilizar excel) un mínimo local de la siguiente función en el intervalo $[1, 4]$, use el punto de partida que considere adecuados. Luego grafique y verifique los resultados con código Python.

$$ f(x) = 3x^4 - 16x^3 + 18x^2. $$

Respuesta:

Note que $f'(x) = 12x^3 - 48x^2 + 36x$, y en cada paso lo que tenemos que hacer es calcular

$$ x_{i+1} = x_i - \eta f'(x_i) \Rightarrow x_{i+1} = x_i - \eta (12x_i^3 - 48x_i^2 + 36x_i) $$

Iniciaremos con $x_0 = 2.5$ (la mitad del intervalo) para ver qué sucede. Utilizaremos un $\eta$ de $0.005$

Los cálculos están en la hoja Pregunta6 del documento en excel: Tarea11_Jimmy_Calvo_Calculos.xlsx adjunto.

Ahora en código Python

Con lo que vemos que hemos llegado al mínimo en $x=3$. He utilizado este $\eta$ ya que después de algunos intentos, éste fue el que me permitió llegar a un mínimo que estuviera en el intervalo. Como se observa en la figura anterior, hay otro mínimo de esta función en $x=0$, y con $\eta$ más grandes, estaba llegando a ese mínimo (ya vimos que el algoritmo del descenso del gradiente puede converger a mínimos locales, eso era lo que estaba pasando en este caso).

Pregunta 7

Usando el algoritmo del Descenso de Gradiente encuentre "a mano" (puede utilizar excel) el mínimo global de la siguiente función, use un punto de partida que considere adecuado. Luego grafique y verifique los resultados con código Python.

$$ f(x,y) = x^4 + y^4 -2x^2 + 4xy - 2y^2. $$

En este caso, nuestro gradiente es igual a

$$ \begin{align*} &\frac{\partial f}{\partial x} = 4x^3 -4x + 4y\\ &\frac{\partial f}{\partial y} = 4y^3 + 4x -4y.\\ \end{align*} $$

Vamos a iniciar con el punto $(x_0,y_0)=(0.5,1.5)$, y utilizaremos un $\eta = 0.01$. Los resultados del cálculo en excel se encuentran en la hoja Pregunta7 del documento Tarea11_Jimmy_Calvo_Calculos.xlsx adjunto.

Ahora, procedemos a revisar estos cálculos con Python.

Vemos que hay una convergencia hacia el punto $(-\sqrt{2},\sqrt{2})$ que es uno de los mínimos locales de esta función.

Pregunta 8

Usando el algoritmo del Descenso de Gradiente encuentre "a mano" (puede utilizar excel) un mínimo local de la siguiente función, use el punto de partida que considere adecuados. Luego grafique y verifique los resultados con código Python.

$$ f(x,y) = x^3 + 3y - y^3 - 3x $$

En este caso, nuestro gradiente es igual a

$$ \begin{align*} &\frac{\partial f}{\partial x} = 3x^2 - 3 \\ &\frac{\partial f}{\partial y} = -3y^2 + 3.\\ \end{align*} $$

Vamos a iniciar con el punto $(x_0,y_0)=(0.8,0.2)$, y utilizaremos un $\eta = 0.01$. Los resultados del cálculo en excel se encuentran en la hoja Pregunta8 del documento Tarea11_Jimmy_Calvo_Calculos.xlsx adjunto.

Seleccioné este punto después de ver el gráfico de la función y adivinar que sería un punto en el cual el descenso del gradiente podría funcionar bien.

Ahora, procedemos a revisar estos cálculos con Python.

Con estos cálculos y los realizados en excel, parece que la convergencia es hacia el mínimo que se encuentra en el punto $(1,-1)$.

Pregunta 9

¿Qué pasa si en el código visto en clase para optimizar una Función de Costo (gradient_descent) se usa un momentum (impulso) más pequeño a $0.7$? ¿Qué pasa si en el código visto en clase para optimizar una Función de Costo (gradient descent) se usa un $\eta$ (learning_rate) de $10^{-9}$?

Vamos a leer los datos utilizando la biblioteca de datasets de sklearn.

Ahora vamos a aplicar la función con los parámetros por defecto, como vimos en clase.

Esto es lo que obtuvimos en clase. Pero ahora qué pasa si tomamos $\eta <0.7$, por ejemplo $0.2$. Veamos.

En este caso vemos que hay una convergencia un poco más rápida hacia un error cuadrático medio de $\epsilon=0$. Si hacemos el learning rate más pequeño, sucederá lo que sigue.

Al disminuir mucho la taza de aprendizaje, se puede ver que se necesitará una cantidad mayor de iteraciones para disminuir el error cuadrádico medio lo suficiente. Y esto tiene sentido, ya que si nuestra taza de aprendizaje es muy pequeña, entonces no habrá mucha diferencia de un paso a otro en el algoritmo del descenso del gradiente.

En este repositorio de github, Lili Jiang creó una aplicación en C++ que permite crear animaciones para visualizar el proceso del descenso del gradiente: gradient_descent_viz.